---
title: 生命周期
---

在 Univer 应用运行过程中，系统会经历一系列有序的生命周期阶段。了解这些生命周期对于开发者来说非常重要，因为这有助于判断何时可以安全地访问业务实例、DOM 元素或进行耗时的异步操作。不同阶段适合执行不同类型的初始化、渲染和性能优化任务。通过监听生命周期变化，开发者能够在最佳时机响应系统状态的变化，实现功能扩展、性能提升或用户体验优化。

Univer 的生命周期主要包括以下四个阶段：

<Mermaid chart="flowchart LR; A([Starting]) --> B([Ready]) --> C([Rendered]) -->D([Steady])" />

1. **Starting**：系统开始初始化，插件内部会进行依赖注入和基础配置。
2. **Ready**：第一个业务实例已创建，插件内部会进行核心功能的初始化。
3. **Rendered**：界面首次渲染完毕，可以安全操作 DOM 或进行界面相关的初始化。
4. **Steady**：系统进入稳定状态，适合执行延迟加载、非关键性任务等优化操作。

不同类型的插件或组件，其生命周期启动时机可能不同，但整体流程遵循上述顺序。开发者可以通过生命周期事件，精准把控功能的加载与执行时机。

<Callout>
  想要深入了解 Univer 的生命周期设计以及具体的插件启动时机，可以在 [《Univer 架构#插件生命周期》](/guides/recipes/architecture/univer#plugin-lifecycle) 中找到相关内容。
</Callout>

## Facade API

### 添加监听器

Univer 提供了统一的事件订阅接口，开发者可以通过 Facade API 监听生命周期的变化：

```typescript
const disposable = univerAPI.addEvent(
  univerAPI.Event.LifeCycleChanged,
  ({ stage }) => {
    if (stage === univerAPI.Enum.LifecycleStages.Steady) {
      // 在 Steady 阶段执行自定义逻辑
    }
  },
)
```

### 移除监听器

要移除监听器，可以使用返回的 `disposable` 对象：

```typescript
disposable.dispose()
```

### 生命周期事件与枚举

Univer 提供了以下生命周期事件和枚举，供开发者使用：

- 事件名：`univerAPI.Event.LifeCycleChanged`

- 生命周期阶段枚举：
  - `univerAPI.Enum.LifecycleStages.Starting`
  - `univerAPI.Enum.LifecycleStages.Ready`
  - `univerAPI.Enum.LifecycleStages.Rendered`
  - `univerAPI.Enum.LifecycleStages.Steady`

### 生命周期监听示例

<Callout type="warning" title="注意事项">
  `univerAPI.Event.LifeCycleChanged` 只会反应生命周期的变化，因此在 `Starting` 阶段不会触发任何事件。
</Callout>

```typescript
const disposable = univerAPI.addEvent(
  univerAPI.Event.LifeCycleChanged,
  ({ stage }) => {
    switch (stage) {
      case univerAPI.Enum.LifecycleStages.Ready:
        console.log('业务实例已创建，可以进行核心初始化')
        break
      case univerAPI.Enum.LifecycleStages.Rendered:
        console.log('界面渲染完成，可以安全操作 DOM')
        break
      case univerAPI.Enum.LifecycleStages.Steady:
        console.log('系统已稳定，可进行延迟加载等优化操作')
        break
    }
  },
)

// 移除监听器
disposable.dispose()
```
